#include "Args.hpp"
#include "Module.hpp"
#include "Function.hpp"

namespace lua
{

Args::Args(Module *module)
{
	if(module)
	{
		mModule = module;
		mNumArgs = lua_gettop(mModule->getLuaVM());
	}
	else
	{
		mModule = Module::currentModule;
		mNumArgs = 0;
	}
}

Args::Args(Module *module, Args &args)
{
	mModule = module;
	if(mModule != args.mModule)
	{
		mNumArgs = args.mNumArgs;
		for(int i = 1; i <= mNumArgs; ++i)
		{
			lua::pushCopy(args.mModule->getLuaVM(), -i, mModule->getLuaVM());
		}
	}
	else
	{
		mNumArgs = args.mNumArgs;
	}
}

const char* Args::getString(int index)
{
	return lua_tostring(mModule->getLuaVM(), index);
}

int Args::getInteger(int index)
{
	return lua_tointeger(mModule->getLuaVM(), index);
}

bool Args::getBoolean(int index)
{
	return lua_toboolean(mModule->getLuaVM(), index) == 1 ? true : false;
}

lua::Function* Args::getFunction(int index)
{
	return &lua::Function(lua_tofunction(mModule->getLuaVM(), index));
}

Module* Args::getModule()
{
	return mModule;
}

void Args::remove(int index)
{
	lua_remove(mModule->getLuaVM(), index);
}

void Args::insert(const char *value)
{
	lua_pushstring(mModule->getLuaVM(), value);
	++mNumArgs;
}

void Args::insert(int value)
{
	lua_pushinteger(mModule->getLuaVM(), value);
	++mNumArgs;
}

void Args::insert(bool value)
{
	lua_pushboolean(mModule->getLuaVM(), value);
	++mNumArgs;
}

}